#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
日志模块 - 提供统一的日志记录功能
"""

import os
import logging
from logging.handlers import RotatingFileHandler
from config import load_config

# 日志实例缓存
_loggers = {}

def setup_logger(name, log_file=None):
    """
    设置并返回一个命名的日志记录器
    
    Args:
        name: 日志记录器名称
        log_file: 日志文件路径，如果为None则使用配置文件中的设置
        
    Returns:
        logging.Logger: 配置好的日志记录器
    """
    # 如果已经创建过这个名称的日志记录器，直接返回
    if name in _loggers:
        return _loggers[name]
    
    # 加载配置
    config = load_config()
    log_config = config.get("logging", {})
    
    # 获取日志级别
    level_name = log_config.get("level", "INFO")
    level = getattr(logging, level_name.upper(), logging.INFO)
    
    # 创建日志记录器
    logger = logging.getLogger(name)
    logger.setLevel(level)
    
    # 如果已经有处理器，不再添加
    if logger.handlers:
        _loggers[name] = logger
        return logger
    
    # 创建格式化器
    log_format = log_config.get("format", "%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    formatter = logging.Formatter(log_format)
    
    # 添加控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(formatter)
    logger.addHandler(console_handler)
    
    # 添加文件处理器（如果配置了日志文件）
    if log_file is None:
        log_file = log_config.get("file")
    
    if log_file:
        # 确保日志目录存在
        log_dir = os.path.dirname(log_file)
        if log_dir and not os.path.exists(log_dir):
            os.makedirs(log_dir)
        
        # 使用 RotatingFileHandler 限制日志文件大小
        max_size = log_config.get("max_size", 10 * 1024 * 1024)  # 默认10MB
        backup_count = log_config.get("backup_count", 5)  # 默认保留5个备份
        
        file_handler = RotatingFileHandler(
            log_file, 
            maxBytes=max_size, 
            backupCount=backup_count,
            encoding='utf-8'
        )
        file_handler.setFormatter(formatter)
        logger.addHandler(file_handler)
    
    # 缓存并返回日志记录器
    _loggers[name] = logger
    return logger

def get_logger(name):
    """
    获取已创建的日志记录器，如果不存在则创建一个新的
    
    Args:
        name: 日志记录器名称
        
    Returns:
        logging.Logger: 日志记录器
    """
    if name in _loggers:
        return _loggers[name]
    return setup_logger(name)